<h1 id="ctypes">API C types</h1>

<p>Duktape API uses typedef-wrapped C types such as <code>duk_int_t</code>,
<code>duk_idx_t</code>, and <code>duk_ret_t</code> almost exclusively to ensure
portability to exotic platforms.  On most platforms these map directly to signed
or unsigned <code>int</code>; the wrappers make it possible to support platforms
where usual type assumptions (like having a 32-bit <code>int</code>) don't hold.
See Wiki article <a href="http://wiki.duktape.org/ApiCTypes.html">API C types</a>
for a detailed discussion.</p>

<p>Summary of best practices:</p>
<ul>
<li>Use Duktape API types such as <code>duk_idx_t</code> and <code>duk_ret_t</code>
    when declaring variables for maximum portability.  Alternatively you may
    use plain types (like <code>long</code>) but your code will be less portable
    and you may need to use casts to avoid warnings.</li>
<li>In <code>printf()</code> and <code>duk_push_sprintf()</code> formatting
    cast Duktape types to a wide integer type and use a standard format specifier.
    Example: <code>printf("Result: %ld\n", (long) duk_get_int(ctx, -3));</code>.</li>
<li>Use the <code>L</code> (or <code>UL</code>) suffix for constants which
    are larger than 16 bits to maximize portability.  Like the <code>int</code>
    type, integer constants without a suffix are only guaranteed to be 16 bits
    wide.  With the <code>L</code> suffix constants are guaranteed to be at least
    32 bits wide.  Example: <code>duk_push_int(ctx, 1234567L);</code>.</li>
</ul>
